[Grunt]EC2にsshログインしてコマンド実行とかSFTPを自動で実行する[AWS]
sshログインやftpアップロードを自動でやりたい
EC2に対して何度もftpでアプリのアップロードやsshでログインして再起動とかやってると、非常に無駄を感じてしまいます。 そんな面倒な作業こそ、Gruntで解決しましょう。 今回はgrunt-sshモジュールを使って、EC2へsshログインとsftpでのファイルアップロードを試してみます。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.4
- npm : 1.2.18
npmを使用して必要モジュールをインストールしましょう。 grunt-cliをグローバルインストール(まだインストールしていなければ)し、サンプル用ディレクトリを作成してpackage.jsonを作成した後、 gruntとgrunt-sshをインストールします。
% npm install -g grunt-cli % mkdir ssh-sample % cd ssh-sample % npm init //package.json作成 % npm install grunt grunt-ssh --save-dev
また、今回はsshやsftpでアクセスする対象のリモートサーバをEC2で用意しました。(Amazon Linuxで22番ポート開放) pemファイルを取得し、sshでEC2にログインできる状態にしておいてください。
sshログインして任意のコマンドを実行
では、gruntタスクを実行してEC2へログインし、適当なコマンドを実行させてみましょう。 ssh-sample直下に、次のようなGruntfile.coffeeを作成します。
module.exports = (grunt) -> pkg = grunt.file.readJSON 'package.json' grunt.initConfig sshexec: test: command: 'date > ./date.txt', options: host: '<EC2のアドレス>', username: 'ec2-user', password: '', privateKey: grunt.file.read("<pemファイルのパス>") grunt.loadNpmTasks 'grunt-ssh'
loadNpmTasksでgrunt-sshモジュールをロードし、実行するコマンドはcommandプロパティで設定します。 とりあえず、date結果をファイルに出力するだけです。ホスト名やユーザー名はoptionsで各設定を行います。 キーファイルの指定は、privateKeyプロパティでpemファイルのパスを指定すればOKです。
では、タスクを実行してみましょう。 タスクを実行後にEC2を確認してみると、date.txtが出力されています。
% grunt sshexec Running "sshexec:test" (sshexec) task Done, without errors.
sftpでファイルアップロード
sftpを使って、指定したファイルをアップロードすることもできます。 ローカルでテストアップロード用に、upfilesディレクトリを作成し、その中に適当なファイルを作成しましょう。 EC2ではホームディレクトリ下に、アップロードしたファイルを置くためのdistディレクトリを作成しておきます。
module.exports = (grunt) -> pkg = grunt.file.readJSON 'package.json' grunt.initConfig sftp: test: files: "upfiles/": "upfiles/*", options: path: '/home/ec2-user/dist/', host: '<EC2のアドレス>', username: 'ec2-user', password: '', privateKey: grunt.file.read("<pemファイルのパス>"), srcBasePath: 'upfiles/' grunt.loadNpmTasks 'grunt-ssh'
sftpではfilesプロパティでアップロードするファイルの指定、pathプロパティでアップロード先ディレクトリの指定をします。 また、srcBasePathを指定することで、アップロードファイルを指定したファイルのパスからsrcBasePathで指定したパスを削除し、 残ったパスをアップロード後のファイルパスとして使用します。
ではsftpを実行してみましょう。問題なくアップロードできることがわかります。
% grunt sftp Running "sftp:test" (sftp) task Done, without errors.
まとめ
今回はgrunt-sshモジュールを使用して、sshログインとsftpを試してみました。 繰り返し行う面倒な作業はとことん自動化して楽をしましょう。
参考サイトなど
- Grunt公式: http://gruntjs.com/
- grunt-ssh: https://github.com/andrewrjones/grunt-ssh